package chain;

import model.Classificacao;
import model.Paciente;

public class MetodoIMC extends AbstractMetodoHandler {
	private double imc = 0;
	private String condicao;

	@Override
	public boolean accept(final Paciente paciente) {
		return paciente.getAltura() > 0 && paciente.getPeso() > 0
				&& (paciente.getSexo() == 'F' || paciente.getSexo() == 'M');
	}

	@Override
	public void fazerCalculo(final Paciente paciente) {
		this.imc = (paciente.getPeso() / Math.pow(paciente.getAltura(), 2));
	}

	@Override
	public void classificar(Paciente paciente) throws Exception {
		if (paciente.getSexo() == 'F') {
			if (imc < 19.1) {
				this.condicao = "Abaixo do peso";
			} else if (imc >= 19.1 && imc < 25.8) {
				this.condicao = "No peso normal";
			} else if (imc >= 25.8 && imc < 27.3) {
				this.condicao = "Marginalmente acima do peso";
			} else if (imc >= 27.3 && imc < 32.3) {
				this.condicao = "Acima do peso ideal";
			} else if (imc >= 32.3) {
				this.condicao = "Obeso";
			}
		} else if (paciente.getSexo() == 'M') {
			if (imc < 20.7) {
				this.condicao = "Abaixo do peso";
			} else if (imc >= 20.7 && imc < 26.4) {
				this.condicao = "No peso normal";
			} else if (imc >= 26.4 && imc < 27.8) {
				this.condicao = "Marginalmente acima do peso";
			} else if (imc >= 27.8 && imc < 31.1) {
				this.condicao = "Acima do peso ideal";
			} else if (imc >= 31.1) {
				this.condicao = "Obeso";
			}
		}
		paciente.addClassificacao(Classificacao
				.classificacao()
				.comMetodo("IMC")
				.comValor(this.imc)
				.comCondicao(this.condicao).build());
	}
}